<?php

require_once APP. 'Vendor'.DS.'PagSeguroLibrary'.DS.'PagSeguroLibrary.php';

class ComprasController extends AppController {

	var $permissao = array(
		'*' => array('modifica_status'),
		'cliente' => array('view', 'finalizar', 'retorno_pagamento'),
		'admin' => array('admin_listar', 'admin_view', 'admin_edit_rastreamento')
	);

	public $components = array('Paginator');

  public function view($id_compra){
    $this->Compra->id = $id_compra;
    $compra = $this->Compra->read();

    if($this->Session->read('Auth.User.id') == $compra['Compra']['id_cliente']){
      $this->set('compra', $compra);
    } else {
      $this->Session->setFlash('Você não está autorizado a visualizar esse pedido.');
    }
  }

  public function finalizar(){
		$this->autoRender = false;
		$this->loadModel('Produto');

		$user = $this->Session->read('Auth.User');
		$carrinho = $this->Session->read('Carrinho.produtos');

		if(count($carrinho) == 0){
			$this->Session->setFlash("É necessário haver pelo menos 1 produto no carrinho para finalizar a compra.");
			$this->redirect(array('controller' => 'produtos', 'action' => 'ver_carrinho'));
		}

		$arrayOfIds = array_keys($carrinho);
		$list = $this->Produto->find('all', array(
				'conditions' => array('Produto.id' => $arrayOfIds, 'Produto.qtd_estoque > 0')
		));

		$dsProduto = $this->Produto->getDataSource();
		$dsCompra = $this->Compra->getDataSource();

		$total = 0;
		$paymentRequest = new PagSeguroPaymentRequest();
		$detalhes_compra = array();
		$dsProduto->begin();
		foreach($list as $produto){
			foreach($carrinho[$produto['Produto']['id']] as $p){
				$quantidade = $p['quantidade'];
				$produto = $this->Produto->getPrecoFinal($produto, $quantidade);
				$preco = (isset($produto['Produto']['novo_preco']))?$produto['Produto']['novo_preco']:$produto['Produto']['preco'];
				$total += $preco * $quantidade;

				$paymentRequest->addItem(
					$produto['Produto']['cd_interno'],
					$produto['Produto']['nome'],
					$quantidade,
					$preco,
					$produto['Produto']['peso'],
				($produto['Produto']['frete_gratis'])?0:null);

				$produto['Produto']['qtd_estoque'] = $produto['Produto']['qtd_estoque'] - $quantidade;

				$this->Produto->id = $produto['Produto']['id'];
				$this->Produto->saveField('qtd_estoque', $produto['Produto']['qtd_estoque']);

				$detalhes_compra[] = array(
					'produto_id' => $produto['Produto']['id'],
					'preco' => $preco,
					'cor_id' => $p['cor_id'],
					'tamanho_id' => $p['tamanho_id'],
					'qtd_produto' => $quantidade
				);
			}
		}

    $sedexCode = PagSeguroShippingType::getCodeByType('SEDEX');
    $paymentRequest->setShippingType($sedexCode);
    $paymentRequest->setShippingAddress(
			$user['cep'],
			$user['endereco'],
			$user['numero_endereco'],
			$user['complemento'],
			$user['bairro'],
			$user['cidade'],
			$user['estado'],
			'BRA'
    );

    $paymentRequest->setSender(
			$user['nome'],
			$user['email'],
			$user['ddd'],
			$user['telefone'],
			'CPF',
			$user['cpf']
    );

    $paymentRequest->setCurrency("BRL");

	$compra['ref'] = $this->gerarReferencia();

    // Referenciando a transação do PagSeguro em seu sistema
    $paymentRequest->setReference($compra['ref']);

    // URL para onde o comprador será redirecionado (GET) após o fluxo de pagamento
    $paymentRequest->setRedirectUrl("http://www.cherriesp.com.br/compras/retorno_pagamento/".$compra['ref']);

    // URL para onde serão enviadas notificações (POST) indicando alterações no status da transação
    $paymentRequest->addParameter('notificationURL', "http://www.cherriesp.com.br/compras/modifica_status/".$compra['ref']);

    try {
			$credentials = PagSeguroConfig::getAccountCredentials();
			$checkoutUrl = $paymentRequest->register($credentials);

			$compra['id_cliente'] = $user['id'];
			$compra['forma_pagamento'] = '';
			$compra['dt_compra'] = date('Y-m-d H:i:s');
			$compra['vl_total'] = $total;
			$compra['situacao_id'] = 1; //Aguardando Pagamento

			$dsCompra->begin();
			$this->Compra->save($compra);
			$this->Compra->salvarDetalhes($this->Compra->id, $detalhes_compra);

			$this->Session->write('Carrinho.produtos', array());
			$dsCompra->commit();
			$dsProduto->commit();

			//header("location:$checkoutUrl");
			$this->redirect($checkoutUrl);
    } catch (PagSeguroServiceException $e) {
    	/*var_dump($e->getMessage());
    	die();*/
			$dsCompra->rollback();
			$dsProduto->rollback();
			throw new BadRequestException("Erro ao enviar seus dados para o PagSeguro. Por favor, verifique seu cadastro e tente novamente.");
   	}
  }

	public function gerarReferencia(){
		$cod_ref = '';
		$ultima_compra = $this->Compra->find('first', array('order' => array('Compra.id' => 'DESC')));
		if(empty($ultima_compra)){
			$old_ref = 0;
		} else {
			$old_ref = $ultima_compra['Compra']['ref'];
		}
		$cod_ref = str_pad(($old_ref + 1), 11, "0", STR_PAD_LEFT);

		return $cod_ref;
	}

  public function admin_listar(){
		$this->Paginator->settings = array(
			'limit' => 25,
			'order' => array('Compra.dt_compra' => 'DESC' )
		);
    $this->set('compras', $this->Paginator->paginate('Compra'));
  }

	public function admin_view($id){
		$this->Compra->id = $id;
		$this->Compra->recursive = 2;
		$this->set('compra', $this->Compra->read());
  }

	public function admin_edit_rastreamento($compra_id){
		$this->Compra->id = $compra_id;
		if(!empty($this->data)){
			$this->Compra->saveField('cd_rastreamento', $this->data['Compra']['cd_rastreamento']);
			$this->redirect(array('admin' => true, 'controller' => 'compras', 'action' => 'listar'));
		} else {
    	$this->data = $this->Compra->read();
		}
  }

	public function admin_alterar_situacao($compra_id){
		$this->Compra->id = $compra_id;
		if(!empty($this->data)){
			$this->Compra->saveField('situacao_id', $this->data['Compra']['situacao_id']);
			if(isset($this->data['Compra']['cd_rastreamento'])){
				$this->Compra->saveField('cd_rastreamento', $this->data['Compra']['cd_rastreamento']);
			}
			$this->redirect(array('admin' => true, 'controller' => 'compras', 'action' => 'listar'));
		} else {
    	$this->data = $this->Compra->read();
		}

		$this->set('situacoes', $this->Compra->Situacao->find('list', array('fields' => array('id','nome'))));
  }

	public function modifica_status($ref = null){
		//TODO permitir apenas o host do pagseguro de acessar essa action
	/*
		debug($ref);
		debug($this->request);*/
		$this->autoRender = false;
		//id_pagseguro

		if(!empty($this->data)){
			try{
				$compra = $this->Compra->find('first', array('conditions' => array('Compra.ref' => $ref)));
				$this->Compra->id = $compra['Compra']['id'];
				$compra['Compra']['notificationCode'] = $this->data['notificationCode'];
				$compra['Compra']['notificationType'] = $this->data['notificationType'];

				if($this->Compra->save($compra['Compra'])){
					echo "Ok";
				}
			} catch(Exception $e){
				die($e->getMessage());
			}
		}
	}

	public function retorno_pagamento($ref = null){
		$this->autoRender = false;

		$id_pagseguro = $this->request->query('id_pagseguro');

		if(!empty($ref) && !empty($id_pagseguro)){
			$compra = $this->Compra->find('first', array('conditions' => array('Compra.ref' => $ref)));
			$this->Compra->id = $compra['Compra']['id'];
			$compra['Compra']['id_pagseguro'] = $id_pagseguro;

			if($this->Compra->save($compra['Compra'])){
				$this->Session->setFlash("Compra efetuada com sucesso!", "sucesso");
			} else {
				$this->Session->setFlash("Erro ao finalizar compra!", "erro");
			}
			$this->redirect(array('admin' => false, 'controller' => 'users', 'action' => 'index'));
		}
	}

}
